import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import rmi.IGestionLibro;

import modelo.*;


public class Cliente {
	
	//Main Cliente
	public static void main(String[] args) {
		Cliente c = new Cliente();
		c.prueba();
	}

	private IGestionLibro objRemoto;
	
	public Cliente() {
		try {
			this.objRemoto = (IGestionLibro) Naming.lookup("//localhost/GestionLibro");
			System.out.println("RMI Conectado");
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		}		
	}
	
	public void prueba() {
		try {
			//Obtener libros
			System.out.println("Obtengo libros:");
			Set<Libro> libros = objRemoto.getLibros();
			Iterator<Libro> iterator = libros.iterator();
			while (iterator.hasNext())
				this.mostrarLibro(iterator.next());
			System.out.println();
			
			//Agrego un nuevo libro con autores
			Autor a1 = new Autor();
			a1.setIdAutor(1);
			Autor a2 = new Autor();
			a2.setIdAutor(2);
			Set<Autor> autores = new HashSet<Autor>();
			autores.add(a1);
			autores.add(a2);
			Libro lib = new Libro();
			lib.setIsbn("ISBN-888-0");
			lib.setTitulo("Lenguajes Visuales");
			lib.setGenero("Informatica");
			lib.setPrecio(210.5F);
			lib.setAutores(autores);
			objRemoto.addLibro(lib);
			
			//Vuelvo a obtener libros incluyendo el nuevo
			System.out.println("Vuelvo a obtener libros incluyendo el nuevo:");
			libros = objRemoto.getLibros();
			iterator = libros.iterator();
			while (iterator.hasNext())
				this.mostrarLibro(iterator.next());
			System.out.println();
			
			//Agrego un libro sin autores y luego se los agrego c/addAutores
			lib = new Libro();
			lib.setIsbn("ISBN-999-2");
			lib.setTitulo("RMI");
			lib.setGenero("Informatica");
			lib.setPrecio(99.9F);
			objRemoto.addLibro(lib);
			Libro libAutores = new Libro();
			libAutores.setIsbn("ISBN-999-2");
			libAutores.setAutores(autores);
			objRemoto.addAutores(libAutores);
			
			//Vuelvo a obtener libros incluyendo el nuevo
			System.out.println("Vuelvo a obtener libros incluyendo el nuevo:");
			libros = objRemoto.getLibros();
			iterator = libros.iterator();
			while (iterator.hasNext())
				this.mostrarLibro(iterator.next());
			System.out.println();
			
			//Obtengo un libro
			System.out.println("Obtengo un libro:");
			lib = new Libro();
			lib.setIsbn("ISBN-999-2");
			Libro libroObt = objRemoto.getLibro(lib);
			this.mostrarLibro(libroObt);
			System.out.println();
			
			//Saco los autores de dicho libro
			objRemoto.delAutor(libroObt);
			
			//Vuelvo a obtener libros, con el libro "RMI" ahora sin autores
			System.out.println("Vuelvo a obtener libros, con el libro \"RMI\" ahora sin autores:");
			libros = objRemoto.getLibros();
			iterator = libros.iterator();
			while (iterator.hasNext())
				this.mostrarLibro(iterator.next());
			System.out.println();
			
			//Borro el libro "RMI"
			objRemoto.delLibro(libroObt);
			
			//Vuelvo a obtener libros, despues de borrar el libro "RMI"
			System.out.println("Vuelvo a obtener libros, despues de borrar el libro \"RMI\":");
			libros = objRemoto.getLibros();
			iterator = libros.iterator();
			while (iterator.hasNext())
				this.mostrarLibro(iterator.next());
			System.out.println();
			
			//Borro el libro "Lenguajes Visuales"
			lib = new Libro();
			lib.setIsbn("ISBN-888-0");
			objRemoto.delLibro(lib);
			
			//Vuelvo a obtener libros, despues de borrar el libro "Lenguajes Visuales"
			System.out.println("Vuelvo a obtener libros, despues de borrar el libro \"Lenguajes Visuales\":");
			libros = objRemoto.getLibros();
			iterator = libros.iterator();
			while (iterator.hasNext())
				this.mostrarLibro(iterator.next());
			System.out.println();
			
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public void mostrarLibro(Libro l) {
		System.out.print("* " + l.getIsbn() + " - " + l.getTitulo().trim() + " - " + l.getGenero().trim() + " - $" + l.getPrecio() + " - ");
		Iterator<Autor> iterator = l.getAutores().iterator();
		while (iterator.hasNext()) {
			Autor a = iterator.next();
			System.out.print(a.getApellido() + ", " + a.getNombre() + " (" + a.getIdAutor() + ") /");
		}
		System.out.println();
	}
	
}
